#ifndef JUEGOSERVERIMP_H_
#define JUEGOSERVERIMP_H_

#include <string>
#include <vector>
#include "NotificadorDeCambios.h"
#include "Mapa.h"
#include "Ataque.h"
#include "EstadoDelJuego.h"
#include "Jugador.h"
#include "Juego.h"
#include "TiradorDeDados.h"

using namespace std;

/** Esta es la implementacion de la interfaz del juego en
 *  el servidor.
 **/

class JuegoServerImp : public Juego
{
private:
	NotificadorDeCambios* notificadorDeCambios;
	vector<Jugador*> jugadores;
	unsigned int cantidadDeJugadores;
	Mapa* mapaDelJuego;
	TiradorDeDados* tiradorDeDados;
	int turno;
	EstadoDelJuego* estadoDeEsperaDeJugadores;
	EstadoDelJuego* estadoDePreparacionDePartida;
	EstadoDelJuego* estadoDeRealizacionDePartida;
		
	EstadoDelJuego* estadoDelJuego;
	
public:
	JuegoServerImp(unsigned int cantidadDeJugadores, Mapa* mapa, TiradorDeDados* tiradorDeDados);
	JuegoServerImp(unsigned int cantidadDeJugadores, Mapa* mapa, TiradorDeDados* tiradorDeDados, NotificadorDeCambios* notificadorDeCambios);
	void unirse(Jugador* jugador);
	void realizarAtaque(Ataque* ataque);
	void colocarEjercitos(Jugador* jugador, Territorio* territorio, unsigned int cantidadDeEjercitos);
	void moverEjercitos(Jugador* jugador, Territorio* origen, Territorio* destino, unsigned int cantidadDeEjercitos);
	void pasar(Jugador* jugador);
	
	EstadoDelJuego* getEstadoDeEsperaJugadores();
	EstadoDelJuego* getEstadoDePreparacionDePartida();
	EstadoDelJuego* getEstadoDeRealizacionDePartida();
	void setEstado(EstadoDelJuego* estado);
	
	Mapa* getMapa();
	TiradorDeDados* getTiradorDeDados();
	vector<Jugador*>* getJugadores();
	Jugador* getJugador(string colorJugador);
	unsigned int getCantidadDeJugadores();
	Jugador* getJugadorEnTurno();
	void pasarAlSiguienteTurno();
	void setTurno(int turno);
	void imprimirEstado();
	void quitarJugador(string colorJugador);
	void abandonar(Jugador* jugador);
	virtual ~JuegoServerImp();
};

#endif /*JUEGOSERVERIMP_H_*/
